/*******************************************************************************************************
 *   Copyright (C) 2009 by Rahul
 *   rahulrs@gmx.com
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the
 *   Free Software Foundation, Inc.,
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *********************************************************************************************************/
#include "kuttansimpl.h"
#include <QFileDialog>
#include <QApplication>
#include <QtGui>
#include <QTranslator>
#include <iostream>
#include <QComboBox>
#include <QFontComboBox>
//
KuttansImpl::KuttansImpl( QWidget * parent, Qt::WFlags f):QMainWindow(parent, f)
{
        readSettings();                     // മുന്‍പ് സംരക്ഷിച്ച ക്രമീകരണങ്ങള്‍ വീണ്ടെടുക്കുക
        QFontComboBox *comboFont;
        QComboBox *comboSize;
	QString arg1;
	setupUi(this);
	inputFile = "";
	outputFile = "";
	actionCut->setEnabled(false);
	actionCopy->setEnabled(false);
        actionDelete->setEnabled(false);
        actionASCIIToUnicodePDF->setEnabled(false);
        actionUnicodeToASCIIPDF->setEnabled(false);
					/*ആജ്ഞകള്‍ അതതിന്റെ പ്രവൃത്തികളുമായി ബന്ധിപ്പിക്കുക*/
	connect(textEdit, SIGNAL(copyAvailable(bool)), actionCut, SLOT(setEnabled(bool)));	//  ഉപയോക്താവ് ഏതെങ്കിലും പാഠഭാഗം തിരഞ്ഞെടുത്തെങ്കില്‍ മാത്രം...
	connect(textEdit, SIGNAL(copyAvailable(bool)), actionCopy, SLOT(setEnabled(bool)));	// 'cut', 'copy' എന്നിവ സജ്ജീവമാക്കുക
	connect(actionOpen, SIGNAL(triggered()), this, SLOT(open()));				//രേഖ തുറക്കാനുള്ള ആജ്ഞ open() എന്ന പ്രവൃത്തിയുമായി ബന്ധിപ്പിക്കുക
	connect(actionSave, SIGNAL(triggered()), this, SLOT(save()));
	connect(actionSaveAs, SIGNAL(triggered()), this, SLOT(saveAs()));
        connect(actionAbout, SIGNAL(triggered()), this, SLOT(about()));

	connect(actionNew, SIGNAL(triggered()), this, SLOT(newFile()));
        connect(actionExportPDF, SIGNAL(triggered()), this, SLOT(filePrintPdf()));
        connect(actionPrint, SIGNAL(triggered()), this, SLOT(filePrint()));
        connect(actionPrintPreview, SIGNAL(triggered()), this, SLOT(filePrintPreview()));
        connect(textEdit->document(), SIGNAL(contentsChanged()), this, SLOT(documentWasModified()));
	connect(actionRevathi_u2a, SIGNAL(triggered()), this, SLOT(Revathi_u2a()));
	connect(actionIndulekha_u2a, SIGNAL(triggered()), this, SLOT(Indulekha_u2a()));
	connect(actionKarthika_u2a, SIGNAL(triggered()), this, SLOT(Karthika_u2a()));
	connect(actionSelectFontMap_u2a, SIGNAL(triggered()), this, SLOT(customMap_u2a()));

	connect(actionRevathi_a2u, SIGNAL(triggered()), this, SLOT(Revathi_a2u()));
	connect(actionIndulekha_a2u, SIGNAL(triggered()), this, SLOT(Indulekha_a2u()));
	connect(actionKarthika_a2u, SIGNAL(triggered()), this, SLOT(Karthika_a2u()));
	connect(actionSelectFontMap_a2u, SIGNAL(triggered()), this, SLOT(customMap_a2u()));
        connect(actionASCIIToUnicodePDF, SIGNAL(triggered()), this, SLOT(asciiToUnicodePDF()));
	setCurrentFile("");
	if (QCoreApplication::argc()>1)						// ഉപയോക്താവ് ഏതെങ്കിലും കമാന്റ് ലൈന്‍ ആര്‍ഗ്യുമെന്റ് തന്നിട്ടുണ്ടോ എന്ന് പരിശോധിക്കുക
	{
             arg1 = QCoreApplication::arguments().at(1);			// ഒന്നാമത്തെ ആര്‍ഗ്യുമെന്റിനെ(തുറക്കേണ്ട രേഖയുടെ പേര്) പിടിച്ചെടുത്ത് സൂക്ഷിക്കുക
	     loadFile(arg1);
	}
        tb = new QToolBar(this);
        tb->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);
        tb->setWindowTitle(tr("Format Actions"));
        //addToolBarBreak(Qt::TopToolBarArea);
        addToolBar(tb);

        comboFont = new QFontComboBox(tb);
        tb->addWidget(comboFont);
        connect(comboFont, SIGNAL(activated(const QString &)), this, SLOT(textFamily(const QString &)));

        comboSize = new QComboBox(tb);
        comboSize->setObjectName("comboSize");
        tb->addWidget(comboSize);
        comboSize->setEditable(true);
        QFontDatabase db;
        foreach(int size, db.standardSizes())
        comboSize->addItem(QString::number(size));
        connect(comboSize, SIGNAL(activated(const QString &)), this, SLOT(textSize(const QString &)));
        comboSize->setCurrentIndex(comboSize->findText(QString::number(QApplication::font().pointSize())));
}
 void KuttansImpl::textSize(const QString &p)
 {
     QTextCharFormat fmt;
     fmt.setFontPointSize(p.toFloat());
     mergeFormatOnWordOrSelection(fmt);
 }
 void KuttansImpl::mergeFormatOnWordOrSelection(const QTextCharFormat &format)
 {
     QTextCursor cursor = textEdit->textCursor();
     if (!cursor.hasSelection())
         cursor.select(QTextCursor::WordUnderCursor);
     cursor.mergeCharFormat(format);
     textEdit->mergeCurrentCharFormat(format);
 }
void KuttansImpl::textFamily(const QString &f)
 {
     QTextCharFormat fmt;
     fmt.setFontFamily(f);
     mergeFormatOnWordOrSelection(fmt);
 }

/*
  ഉപയോക്താവ് ഒരു പുതിയ രേഖ ഉണ്ടാക്കാനുള്ള ആജ്ഞ തരികയാണെങ്കില്‍ ആദ്യം ടൈപ്പ് ചെയ്യാനുള്ള സ്ത്ലലം വൃത്തിയാക്കണം. എന്നാല്‍ ഉപയോക്താവ് നിലവില്‍ തുറന്നിരിക്കുന്ന
  രേഖയില്‍ എന്തെങ്കിലും മാറ്റം വരുത്തിയിട്ടുണ്ടെങ്കില്‍ അത് സംരക്ഷിക്കാനുള്ള ഒരവസരം നല്കണം അതിന് വേണ്ടിയാണ് 'maybeSave()' എന്ന പ്രവൃത്തി
*/
  void KuttansImpl::newFile()
 {
     if (maybeSave())
      {
         textEdit->clear();
         setCurrentFile("");
      }
 }
  bool KuttansImpl::maybeSave()
 {
     if (textEdit->document()->isModified())
      {
         QMessageBox::StandardButton ret;
         ret = QMessageBox::warning(this, tr("Information"), tr("<h4 align=\"center\">The document has been modified.<p><h4 align=\"center\">Do you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
         if (ret == QMessageBox::Save)
             return save();
         else if (ret == QMessageBox::Cancel)
             return false;
     }
     return true;
 }

 bool KuttansImpl::save()
 {
     if (curFile.isEmpty())
     	{
         return saveAs();
     	}
     else
     	{
         return saveFile(curFile);
     	}
 }

 bool KuttansImpl::saveAs()
 {
     QString fileName = QFileDialog::getSaveFileName(this);
     if (fileName.isEmpty())
         return false;
     return saveFile(fileName);
 }
 bool KuttansImpl::saveFile(const QString &fileName)
 {
     QFile file(fileName);
     if (!file.open(QFile::WriteOnly | QFile::Text))
      {
         QMessageBox::warning(this, tr("Warning"), tr("<h4 align=\"center\">Cannot write file %1:<p><h4 align=\"center\">%2.") .arg(fileName).arg(file.errorString()));
         return false;
      }
     QTextStream out(&file);
     QApplication::setOverrideCursor(Qt::WaitCursor);
     out << textEdit->toPlainText();
     QApplication::restoreOverrideCursor();
     setCurrentFile(fileName);
     statusBar()->showMessage(tr("File saved"), 2000);
     inputFile = fileName;
     return true;
 }

void KuttansImpl::open()
{
	QString fileName = QFileDialog::getOpenFileName(this, tr("Open file to convert"), "*.*", tr("")/*tr("Image Files (*.png *.jpg *.bmp)")*/);
	//textEdit->append(fileName);
	if (!fileName.isEmpty())
		loadFile(fileName);
}

 void KuttansImpl::loadFile(const QString &fileName)
 {
	QFile file(fileName);
	inputFile=fileName;
	if (!file.open(QFile::ReadOnly | QFile::Text))
		 {
                        QMessageBox::warning(this, tr("Kuttans"), tr("<h4 align=\"center\">Cannot read file %1:<p><h4 align=\"center\">%2.") .arg(fileName) .arg(file.errorString()));
			return;
		 }
	QTextStream in(&file);
	QApplication::setOverrideCursor(Qt::WaitCursor);
	textEdit->setPlainText(in.readAll());				// തുറന്ന രേഖ ജാലകത്തി‌ല്‍ പ്രദര്‍ശിപ്പിക്കുക
	QApplication::restoreOverrideCursor();
	setCurrentFile(fileName);
	statusBar()->showMessage(tr("File Opened"), 2000);	// ൨൦൦൦ മില്ലി സെക്കന്റ് നേരം സ്റ്റാറ്റസ് ബാറില്‍ പ്രദര്‍ശിപ്പിക്കുക
 }

  void KuttansImpl::setCurrentFile(const QString &fileName)
 {
     curFile = fileName;
     textEdit->document()->setModified(false);
     setWindowModified(false);

     QString shownName;
     if (curFile.isEmpty())
         shownName = tr("untitled.txt"); 			// ഉപയോക്താവ് ഒരു പുതിയ രേഖ ഉണ്ടാക്കുകയാനെങ്കില്‍ തലക്കെട്ട് പേരില്ലാത്ത.txt (or untitled.txt depending on licalization) എന്ന് ക്രമീകരിക്കുക
     else
         shownName = strippedName(curFile);
     setWindowTitle(tr("%1[*] - %2").arg(shownName).arg(tr("Kuttans")));	// ജാലകത്തിന്റെ മുകളില്‍ 'രേഖയുടെ പേര്.txt--കുട്ടന്‍സ്' എന്ന് പ്രദര്‍ശിപ്പിക്കുക
 }
void KuttansImpl::documentWasModified()
{
     setWindowModified(textEdit->document()->isModified());
}
void KuttansImpl::filePrintPdf()
 {
 #ifndef QT_NO_PRINTER
     QString fileName = QFileDialog::getSaveFileName(this, tr("Export PDF"), QString(), "*.pdf");
     if (!fileName.isEmpty())
     {
         if (QFileInfo(fileName).suffix().isEmpty())
             fileName.append(".pdf");
         QPrinter printer(QPrinter::HighResolution);
         printer.setOutputFormat(QPrinter::PdfFormat);
         printer.setOutputFileName(fileName);
         textEdit->document()->print(&printer);
     }
 }
 #endif
 void KuttansImpl::filePrint()
 {
 #ifndef QT_NO_PRINTER
     QPrinter printer(QPrinter::HighResolution);
     QPrintDialog *dlg = new QPrintDialog(&printer, this);
     if (textEdit->textCursor().hasSelection())
         dlg->addEnabledOption(QAbstractPrintDialog::PrintSelection);
     dlg->setWindowTitle(tr("Print Document"));
     if (dlg->exec() == QDialog::Accepted) {
         textEdit->print(&printer);
     }
     delete dlg;
 #endif
 }

 void KuttansImpl::filePrintPreview()
 {
 #ifndef QT_NO_PRINTER
     QPrinter printer(QPrinter::HighResolution);
     QPrintPreviewDialog preview(&printer, this);
     connect(&preview, SIGNAL(paintRequested(QPrinter *)), SLOT(printPreview(QPrinter *)));
     preview.exec();
 #endif
 }

 void KuttansImpl::printPreview(QPrinter *printer)
 {
 #ifdef QT_NO_PRINTER
     Q_UNUSED(printer);
 #else
     textEdit->print(printer);
 #endif
 }
void KuttansImpl::closeEvent(QCloseEvent *event)
 {
    if (maybeSave())
    {
         writeSettings();                   // ഉപയോക്താവിന്റെ ക്രമീകരണങ്ങള്‍ സംരക്ഷിക്കുക
         event->accept();
     }
    else
     {
         event->ignore();
     }
 }
void KuttansImpl::writeSettings()
 {
     QSettings settings("SMC", "Kuttans");
     settings.setValue("pos", pos());
     settings.setValue("size", size());
 }
void KuttansImpl::readSettings()
 {
     QSettings settings("SMC", "Kuttans");
     QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
     QSize size = settings.value("size", QSize(400, 400)).toSize();
     resize(size);
     move(pos);
 }
void KuttansImpl::about()
 {
    QMessageBox::about(this, tr("About Kuttans"),
             tr("<h2 align=\"center\"><b>Kuttans 0.01</h2><p><h4 align=\"center\">Kuttans (QT+Payyans) is a GUI frontend for payyans"));
 }
/*---------------------------------------------------------------------ആസ്ക്കിയില്‍നിന്നും യൂണിക്കോഡിലേക്ക് മാറ്റാനുള്ള പരിപാടികളുടെ തുടക്കം----------------------------------------------------------------------*/
void KuttansImpl::customMap_a2u()
 {
	QString ret;
	if (!checkDocStatus("a2u"))
	    return;
	ret = getMapFileName();
	if (ret!="")
	    ASCIIToUnicode (ret, inputFile);
 }
 void KuttansImpl::Revathi_a2u()								// ഈ ഒരുപോലെ കാണുന്ന മൂന്നെണ്ണവും അഹങ്കാരം കൊണ്ട് ചേര്‍ത്തതാണ്  പിന്നീട് എടുത്ത് മാറ്റണം
 {
	if (!checkDocStatus("a2u"))
	    return;
	ASCIIToUnicode ("/usr/share/payyans/maps/revathi.map", inputFile);
 }
 void KuttansImpl::Indulekha_a2u()
 {
	if (!checkDocStatus("a2u"))
	    return;
	ASCIIToUnicode ("/usr/share/payyans/maps/indulekha.map", inputFile);
 }
 void KuttansImpl::Karthika_a2u()
 {
	if (!checkDocStatus("a2u"))
	    return;
	ASCIIToUnicode ("/usr/share/payyans/maps/karthika.map", inputFile);
 }
 void KuttansImpl::ASCIIToUnicode(QString mapFile, QString sourceFile)
 {
      char ret;
      if (sourceFile=="")
      {
	    std::cout<<"No Input Files\n";
            QMessageBox::information(this, tr("Error!"), tr("<h4 align=\"center\">No file selected to convert<p><h4 align=\"center\">FIrst open the file you want to convert to Unicode"));
	    return;
      }
      else
      {
	    outputFile = directoryName(sourceFile)+"/ucode_"+strippedName(sourceFile);	//യൂണിക്കോഡാക്കി മാറ്റിയ ഫയല്‍, യഥാര്‍ഥ ഫയല്‍ ഉണ്ടായിരുന്ന അതേ കൂടയില്‍ 'ucode_original-name ' എന്ന പേരോടുകൂടി സൂക്ഷിക്കാനുള്ള വിദ്യ.
            mapFileString = mapFile.toUtf8().data();                    // ഫയലിന്റെ പേരുകളെല്ലാം ക്യുടിക്ക് മാത്രം മനസ്സിലാവുന്ന ഭാഷയിലാണുള്ളത് അത് സാധാരണ സ്ട്രിങ്ങാക്കാനുള്ള പരിപാടി
	    sourceFileString = sourceFile.toUtf8().data();
	    outputFileString = outputFile.toUtf8().data();
	    //payyans -i ascii_ascii_ml_ucode.txt -m /usr/share/payyans/maps/indulekha.map -o unicodefile.txt -d a2u
            command = "payyans -i "+ sourceFileString + " -m " + mapFileString + " -o " + outputFileString + " -d a2u ";     // പയ്യന്‍സിന്  കൊടുക്കാനുള്ള നിര്‍ദ്ദേശങ്ങള്‍ തയ്യാറാക്കുന്നു
            systemCommand = command.c_str();                     // command 'string' രൂപത്തിലാണ് ഇത്  'system()' ന് മനസ്സിലാവില്ല അതുകൊണ്ട് 'const char*' രൂപത്തിലേക്ക് മാറ്റുക
	    statusBar()->showMessage(tr("Converting ASCII File To Unicode"), 0);	// എന്തുകൊണ്ടാണെന്നറിയില്ല ഇത്  system() കമാന്റ് കഴിഞ്ഞേ സ്റ്റാറ്റസ് ബാറില്‍ കാണിക്കുന്നുള്ളൂ, പിന്നെ ശരിയാക്കാം
            std::cout<<systemCommand<<"\n";                        // ഒരു തമാശയ്ക്ക് , പയ്യന്‍സിന് കൊടുക്കുന്ന നിര്‍ദ്ദേശങ്ങള്‍ ടെര്‍മിനലില്‍ കാണിക്കുക
            if (system(systemCommand)<0)                                  // എല്ലാം കഴിഞ്ഞു ഇനി പയ്യന്‍സിനോട് അജ്ഞാപിച്ചാല്‍ മതി
                QMessageBox::warning(this, tr("Error"), tr("<h4 align=\"center\">Cannot Convert the file.<p><h4 align=\"center\"> Error code: 101") );
	    statusBar()->clearMessage();
            ret = conversionDone(tr("Success"), tr("<h4 align=\"center\">ASCII file is successfully converted to Unicode<p><h4 align=\"center\">Do you want to open the Unicode file")+outputFile+tr(" now?"));
	    if (ret==1)
		{
			command = "/home/rahul/Programming/kuttans/bin/kuttans "+ outputFileString+"&";
			systemCommand = command.c_str();
                        if(system(systemCommand)<0)
                            QMessageBox::warning(this, tr("Error"), tr("<h4 align=\"center\">Cannot open the converted file.<p><h4 align=\"center\"> Error code: 102") );
		}
      }
 }

/*-------------------------------------------------------യൂണിക്കോഡില്‍നിന്നും ആസ്ക്കിയിലേക്ക് മാറ്റാനുള്ള പരിപാടികളുടെ തുടക്കം------------------------------------------------------------------------------------*/
 void KuttansImpl::customMap_u2a()
 {
	QString ret;
	if (!checkDocStatus("u2a"))
	    return;
	ret = getMapFileName();
	if (ret!="")
            unicodeToASCII (ret, inputFile);		// എല്ലാ പ്രശ്നങ്ങളും തരണം ചെയ്ത്  വരുന്നവനെ യൂണിക്കോഡാന്‍ അനുവദിക്കുക
 }
 void KuttansImpl::Revathi_u2a()                          // ഈ ഒരുപോലെ കാണുന്ന മൂന്നെണ്ണവും അഹങ്കാരം കൊണ്ട് ചേര്‍ത്തതാണ്  പിന്നീട് എടുത്ത് മാറ്റണം
 {
	if (!checkDocStatus("u2a"))
	    return;
	unicodeToASCII ("/usr/share/payyans/maps/revathi.map", inputFile);
 }
 void KuttansImpl::Indulekha_u2a()
 {
	if (!checkDocStatus("u2a"))
	    return;
	unicodeToASCII ("/usr/share/payyans/maps/indulekha.map", inputFile);
 }
 void KuttansImpl::Karthika_u2a()
 {
	if (!checkDocStatus("u2a"))
	    return;
	unicodeToASCII ("/usr/share/payyans/maps/karthika.map", inputFile);
 }
 void KuttansImpl::unicodeToASCII(QString mapFile, QString sourceFile)
 {
      char ret;
      if (sourceFile=="")
      {
	    std::cout<<"No Input Files\n";
            QMessageBox::information(this, tr("Error!"), tr("<h4 align=\"center\">No file selected to convert<p><h4 align=\"center\">FIrst open the file to convert to ASCII"));
	    return;
      }
      else
      {
	    outputFile = directoryName(sourceFile)+"/ascii_"+strippedName(sourceFile);	//ആസ്ക്കിയാക്കി മാറ്റിയ ഫയല്‍, യഥാര്‍ഥ ഫയല്‍ ഉണ്ടായിരുന്ന അതേ കൂടയില്‍ 'ascii_original-name ' എന്ന പേരോടുകൂടി സൂക്ഷിക്കാനുള്ള വിദ്യ.
	    mapFileString = mapFile.toUtf8().data();		// ഫയലിന്റെ പേരുകളെല്ലാം ക്യുടിക്ക് മാത്രം മനസ്സിലാവുന്ന ഭാഷയിലാണുള്ളത് അത് സാധാരണ സ്ട്രിങ്ങാക്കാനുള്ള പരിപാടി
	    sourceFileString = sourceFile.toUtf8().data();
	    outputFileString = outputFile.toUtf8().data();
	    command = "payyans -i "+ sourceFileString + " -m " + mapFileString + " -o " + outputFileString + " -d u2a ";     // പയ്യന്‍സിന്  കൊടുക്കാനുള്ള നിര്‍ദ്ദേശങ്ങള്‍ തയ്യാറാക്കുന്നു
	    systemCommand = command.c_str();			// command 'string' രൂപത്തിലാണ് ഇത്  'system()' ന് മനസ്സിലാവില്ല അതുകൊണ്ട് 'const char*' രൂപത്തിലേക്ക് മാറ്റുക
	    statusBar()->showMessage(tr("Converting Unicode File To ASCII"), 0);	// എന്തുകൊണ്ടാണെന്നറിയില്ല ഇത്  system() കമാന്റ് കഴിഞ്ഞേ സ്റ്റാറ്റസ് ബാറില്‍ കാണിക്കുന്നുള്ളൂ, പിന്നെ ശരിയാക്കാം
	    std::cout<<systemCommand<<"\n";			// ഒരു തമാശയ്ക്ക് , പയ്യന്‍സിന് കൊടുക്കുന്ന നിര്‍ദ്ദേശങ്ങള്‍ ടെര്‍മിനലില്‍ കാണിക്കുക
            if (system(systemCommand)<0	)			// എല്ലാം കഴിഞ്ഞു ഇനി പയ്യന്‍സിനോട് അജ്ഞാപിച്ചാല്‍ മതി
            {                                                         // പയ്യാ ഒരു ചെറിയ സഹായം വേണം ഒരു ആസ്ക്കി ഫയല്‍ അങ്ങോട്ടു തരാം. അവനെ ഒന്നു യൂണിക്കോഡാക്കി തിരിച്ചു തരണം, നാണം കെടുത്തരുത്
                QMessageBox::warning(this, tr("Error"), tr("<h4 align=\"center\">Cannot convert the file.<p><h4 align=\"center\"> Error code: 103") );
            }
	    statusBar()->clearMessage();
            ret = conversionDone(tr("Success"), tr("<h4 align=\"center\">Unicode file is successfully converted to ASCII<p><h4 align=\"center\">Do you want to open the ASCII file")+outputFile+tr(" now?"));
	    if (ret==1)
		{
			command = "/home/rahul/Programming/kuttans/bin/kuttans "+ outputFileString+"&";
			systemCommand = command.c_str();
                        if(system(systemCommand)<0)
                            QMessageBox::warning(this, tr("Error"), tr("<h4 align=\"center\">Cannot open the converted file.<p><h4 align=\"center\"> Error code: 104") );
		}
      }
 }
/*-------------------------------------------------------യൂണിക്കോഡില്‍നിന്നും ആസ്ക്കിയിലേക്ക് മാറ്റാനുള്ള പരിപാടികളുടെ അവസാനം-------------------------------------------------------------------------*/
void KuttansImpl::asciiToUnicodePDF()
{
    // $ payyans -i hg.pdf -m /usr/share/payyans/maps/indulekha.map -o  unicodefile.txt -d a2u
    // ഇവിടെ പിഡിഎഫ് മാറ്റുന്നതിനുള്ള കോഡ് ചേര്‍ക്കണം
}
/*------------------------------------------യൂണിക്കോഡില്‍നിന്നും ആസ്ക്കിയിലേക്കും തിരിച്ചും മാറ്റാന്‍ പൊതുവായി ആവശ്യം വരുന്ന ജോലികള്‍-------------------------------------------------------- */
 bool KuttansImpl::checkDocStatus(QString uniOrAsc)
 {
	QString ret;
	bool saveStatus;
	if (textEdit->document()->isModified())	// നിലവിലുള്ള രേഖയില്‍ എന്തെങ്കിലും മാറ്റം വരുത്തിയിട്ടുണ്ടെങ്കില്‍ അത് സംരക്ഷിക്കാന്‍ അവസരം നല്കുക
	{
	      QMessageBox::StandardButton ret;
              ret = QMessageBox::warning(this, tr("Information"), tr("<h4 align=\"center\">The document has been modified.<p><h4 align=\"center\">Do you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
	      if (ret == QMessageBox::Save)	// ഉപയോക്താവ് രേഖ സൂക്ഷിക്കാനുള്ള ആജ്ഞ നല്കിയാല്‍ അത് നടപ്പിലാക്കാനുള്ള പരിപാടികള്‍ തുടങ്ങുക
	      {
		    saveStatus = save();
		    if (saveStatus==false)		// സൂക്ഷിക്കുന്നതില്‍ എന്തെങ്കിലും പ്രശ്നമുണ്ടായാല്‍ മുന്നോട്ട് പോവാതെ ഈ പ്രവൃത്തിയില്‍ നിന്നും രക്ഷപ്പെടുക
			   return false;
		    else
			   return true;
	      }
              else if (ret == QMessageBox::Discard)     // ഉപയോക്താവ് രേഖ സംരക്ഷിക്കാന്‍ ആഗ്രഹിക്കുന്നിലെങ്കില്‍.....
              {
                  std::cout<<"DIscard Clicked\n";
 // Add code to save file in a temporary location and after convertion delete the file
                  return false;
              }
	      else
              {
                  return false;
                  std::cout<<"Cancel Clicked\n";
              }
	}
	if (inputFile=="")				// ആരെങ്കിലും ഒരു രേഖയും തുറക്കാതെ യൂണിക്കോഡിലേക്കോ ആസ്ക്കിയിലേക്കോ മാറ്റാന്‍ ശ്രമിച്ചാല്‍ അവനെ പേടിപ്പിക്കുക
	{
	    std::cout<<"No Input Files\n";
            QMessageBox::information(this, tr("Error!"), tr("<h4 align=\"center\">No file selected to convert<p><h4 align=\"center\">FIrst open the file to convert"));
	    return false;
	}
 }
 QString KuttansImpl::getMapFileName()
 {
	QFileDialog::Options options;
	QString selectedFilter;
	//QString fileName = QFileDialog::getOpenFileName(this, tr("Select the fontmap file"), openFileNameLabel->text(), tr("All Files (*);;Text Files (*.txt)"), &selectedFilter, options);
        QString fileName = QFileDialog::getOpenFileName(this, tr("Select the fontmap file"), QDir::homePath (), tr("Font Maps (*.map);;All Files (*)"));
	if (!fileName.isEmpty())
	    return fileName;
	return "";
 }

  QString KuttansImpl::directoryName(const QString &fullFileName)			// യവന് ഫയല്‍ പാത്ത് കൊടുത്താല്‍ ഫയലിന്റെ പേര് ഒഴിവാക്കി ബാക്കി തിരിച്ചു തരും
 {												// ഉദാ:- കൊടുക്കുന്നത് '/home/kuttans/something.txt' എന്നാണെങ്കില്‍ തിരിച്ചു തരുന്നത്
     return QFileInfo(fullFileName).absolutePath();					// '/home/kuttans/' എന്നായിരിക്കും.
 }

  QString KuttansImpl::strippedName(const QString &fullFileName)			// ഇവന്‍ മുകളിലുള്ളവന്‍ ചെയ്യുന്നതിന്റെ നേരെ വിപരീതമേ ചെയ്യൂ
 {												// '/home/kuttans/something.txt' എന്നു കൊടുത്താല്‍ something.txt' മാത്രമേ തിരിച്ചു തരൂ, ദുഷ്ടന്‍.
     return QFileInfo(fullFileName).fileName();
 }

 char KuttansImpl::conversionDone(QString titleBarText, QString message)
 {
     QMessageBox::StandardButton reply;							// മെസ്സേജ് ബോക്സ് തരുന്ന മറുപടി സൂക്ഷിക്കാനുള്ള സാധനം
     reply = QMessageBox::question(this, titleBarText, message, QMessageBox::Yes | QMessageBox::No);
     if (reply == QMessageBox::Yes)
         return 1;
     else
         return 0;

 }
